package part03_工厂模式.p03_工厂方法模式;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**传统模式
 * 应用场景：购买披萨的项目，要便于披萨种类的扩展，便于维护
 * 1-披萨的种类有很多，比如GreekPizza，CheesePizza
 * 2-披萨的制作步骤有prepare、bake、cut、box
 * 3-完成披萨店订购功能
 *
 * 补充功能：
 * 1-客户在点披萨时，可以点不同口味的披萨，比如”北京的奶酪披萨，北京的起司披萨，伦敦的奶酪披萨“
 *
 * 思路：
 * 使用工厂方法模式
 * 把披萨项目的实例化功能抽象成抽象方法，在不同的口味点餐子类中具体实现
 * 定义了一个创建对象的抽象方法，由子类决定要实例化的类，工厂方法模式把对象的实例化推迟到了子类
 *
 * @ClassName: OrderPizza
 * @Author: AllenSun
 * @Date: 2019/12/5 19:41
 */
public abstract class OrderPizza03 {

    //构造器，在简单工厂模式里，把这一块的内容封装起来，放到SimpleFactory里去
    public OrderPizza03(){
        Pizza03 pizza03=null;
        String orderType;//订购披萨的类型
        do {
            orderType=getType();
            pizza03=createPizza(orderType);

            pizza03.prepare();
            pizza03.bake();
            pizza03.cut();
            pizza03.box();
            System.out.println("您点的"+pizza03.name+"披萨已经做好了，请慢用");

        } while (true);
    }

    //定义一个抽象方法，具体的实现交给工厂子类去实现
    abstract Pizza03 createPizza(String orderType);


    //写一个方法，可以获取客户希望订购的披萨种类
    private String getType(){
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入披萨的种类：");
            String str=strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

